//
//  main.m
//  08_iOS9新特性(Nullabilty , 泛型, _Kindof)
//
//  Created by dllo on 16/7/13.
//  Copyright © 2016年 LST. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Truck.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
    // 1.Nullability
    {
    // nonnull 修饰的属性 对应的getter 和 setter方法
    Person *person = [[Person alloc] init];
    person.name = @"张三";
    // nullable 修饰的属性, 对应的getter 和 setter
    //    person setSex:<#(NSString * _Nullable)#>
    //    [person sex];
    person.sex = nil;
    // null_resettable
    // set 方法可以为空
    //person setFriends:<#(NSArray * _Nullable)#>
    // getter 方法不能为空
    [person friends];
    }

    // 泛型
    // 带泛型的容器(规定了容器中所存储的类型)
    // 带泛型的数组
    // 声明一个可变数组, 内部存放的都是NSString
    // 1.数组中添加其他类型会有警告
    // 2.数组取出来的类型不再是id类型, 对应变成声明时的类型
    // 3.泛型会改变类的一些方法, 使与声明的类型相同
    NSMutableArray<NSString *> *array = [NSMutableArray arrayWithObjects:@"123", nil];
    //    [array.firstObject.length];
    [array addObject:@"234"];
    // 带泛型的字典
    NSMutableDictionary<NSString *, NSString *> *dic= [NSMutableDictionary dictionaryWithObjectsAndKeys:@"含蓄", @"name", nil];
    [dic objectForKey:@"name"].length;
    // 自定义的泛型
    Truck<Person *> *truck = [[Truck alloc] init];
    Truck<Student *> *truck1 = [[Truck alloc] init];
    Person *per = [[Person alloc] init];
    Student *stu = [[Student alloc] init];
    [truck addObject:per];
    stu.stuNum = @"0001";
    [truck addObject:stu];
    [truck1 addObject:stu];
    // 协变性 与 逆变性
    Truck *truck2 = nil;
    Truck<NSArray *> *truck3 = nil;
    Truck<NSMutableArray *> *truck4 = nil;
    // 大类型(任意类型) 可以给有泛型的赋值
    // 也可以有泛型的给他赋值
    truck2 = truck3;
    truck2 = truck4;
    truck3 = truck2;
    truck4 = truck2;
    // --covariant 协变性 子类给父类赋值是, 自动强转
    // Truck<NSArray *> 与 Truck<NSMutableArray *>
    truck3 = truck4;
    // __contravariant 逆变性 父类给子类赋值, 自动强转(暂时不知道应用何处)
    //truck4 = truck3;
    // 3.__Kindof
    // 加__kindof修饰后, 返回类型及其子类, 都可以接受这个返回值
    Truck *truckKindof = [[Truck alloc] init];
   NSMutableArray *arr = (NSMutableArray *)[truckKindof returnArray];
    NSArray *arr1 = [truckKindof returnArray];
    
    
    
    return 0;
}
